package monopoli.gui;


import java.util.ArrayList;
import monopoli.Monopoli;
import monopoli.MonopoliApp;
import monopoli.game.Giocatore;

/**
 *
 * @author Claudio
 */
public class GUI implements GUIInterface {

    private GestoreRefresh gestoreRefresh;
    private ContenitoreCarte contenitoreCarte;
    private ContenitoreSoldi contenitoreSoldi;
    private Tabellone tabellone;
    private Sommario sommario;
    private PannelloDiComando pannello;
    private MonopoliApp monopoliApp;
    private JStart startDialog;

    public JStart getStartDialog() {
        return startDialog;
    }

    public void setStartDialog(JStart startDialog) {
        this.startDialog = startDialog;
    }



    public GUI() {
        contenitoreCarte = new ContenitoreCarte();
        contenitoreSoldi = new ContenitoreSoldi();
        tabellone = new Tabellone();
        sommario = new Sommario();
        pannello = new PannelloDiComando();
        monopoliApp = MonopoliApp.getApplication();
        gestoreRefresh = new GestoreRefresh(monopoliApp.getMonopoliView());

    }

    @Override
    public void Inizio(String s) {

        monopoli.Monopoli.getMonopoliPartita().getGameToGUI().avvioGioco(s);
    }


    @Override
    public void richiestaPartecipaPartita() {

        Monopoli.getMonopoliPartita().getGameToGUI().richiestaPartecipaPartita();

    }


    @Override
    public void confermaPartecipaPartita(int idOrdine) {

        startDialog.confermaPartecipa(idOrdine);
        infoPlayer("ATTENDI IL TUO TURNO..");
        //this.AggiornaTabellone();
    }


    @Override
    public void rifiutaPartecipaPartita(String msg) {
        startDialog.rifiutaPartecipa(msg);
    }

    @Override
    public void AggiornaSommario(String name,Object val) {

        //Aggiorno oggetto sommario
        if(name.compareTo("nomeGiocatore") == 0)
            this.sommario.setNomeGiocatore((String)val);
        else if(name.compareTo("pedina") == 0)
            this.sommario.setPedina(Pedina.idToName( ((Integer)(val)).intValue()));
        else if(name.compareTo("possedimenti") == 0)
            this.sommario.setPossedimenti((ArrayList)val);
        else if(name.compareTo("soldi") == 0)
            this.sommario.setBanconote((ArrayList)val);
        else if(name.compareTo("giocatori") == 0)
            this.sommario.setGiocatori((ArrayList)val);
        else
             Monopoli.getMonopoliGUI().debugMessage("[DBG_gui] Aggiornamento Sommario fallito. Non identificato oggetto da aggiornare : " + name );

        //aggiornamento grafico
        this.gestoreRefresh.refreshSommario(this.sommario);

    }

    @Override
    public void AggiornaContenitoreSoldi() {
    }

    @Override
    public void AggiornaContenitoreCarte() {
    }

    @Override
    public void AggiornaPannelloDiComando(String name,Object val) {
        if(name.compareTo("Azione") == 0) {
            String s = (String)val;
            if(s.compareTo("InizioTurno") == 0)
                this.pannello.setIniziaTurno(true);
            else if(s.compareTo("AttesaTurno") == 0)
                this.pannello.setAttesaTurno(true);
            else if(s.compareTo("PassaTurno") == 0)
                this.pannello.setPassaTurno(true);
        }

        else
             Monopoli.getMonopoliGUI().debugMessage("[DBG_gui] Aggiornamento Pannello di Comando fallito. Non identificato oggetto da aggiornare : " + name );

        //aggiornamento grafico
        this.gestoreRefresh.refreshPannello(this.pannello);

    }


    @Override
    public void AggiornaTabellone() {

        this.gestoreRefresh.refreshTabellone(tabellone);
    }

    @Override
    public void InviaMsg() {
    }

    @Override
    public void IndiciAsta() {
    }

    @Override
    public void Fine() {
    }

    @Override
    public void Prigione() {
    }

    @Override
    public void ComunicaPedina(int i) {
        monopoli.Monopoli.getMonopoliPartita().getGameToGUI().scegliPedina(i);
    }

    public String OttieniProprieta() {
        return monopoli.Monopoli.getMonopoliPartita().getGameToGUI().ottieniProprieta();
    }

    @Override
    public int lanciaDadi() {
        return monopoli.Monopoli.getMonopoliPartita().getGameToGUI().lanciaDadi();
    }

    @Override
    public void debugMessage(String strMsg) {
        this.gestoreRefresh.refreshDebugConsole(strMsg);

    }

    @Override
    public void infoPlayer(String strMsg) {
        this.gestoreRefresh.refreshPlayerConsole(strMsg);
    }



    public void appendInfoPlayer(String strMsg) {
        this.gestoreRefresh.appendRefreshPlayerConsole(strMsg);
    }


    public ContenitoreCarte getContenitoreCarte() {
        return contenitoreCarte;
    }

    public void setContenitoreCarte(ContenitoreCarte contenitoreCarte) {
        this.contenitoreCarte = contenitoreCarte;
    }

    public ContenitoreSoldi getContenitoreSoldi() {
        return contenitoreSoldi;
    }

    public void setContenitoreSoldi(ContenitoreSoldi contenitoreSoldi) {
        this.contenitoreSoldi = contenitoreSoldi;
    }

    public GestoreRefresh getGestoreRefresh() {
        return gestoreRefresh;
    }

    public void setGestoreRefresh(GestoreRefresh gestoreRefresh) {
        this.gestoreRefresh = gestoreRefresh;
    }

    public MonopoliApp getMonopoliApp() {
        return monopoliApp;
    }

    public void setMonopoliApp(MonopoliApp monopoliApp) {
        this.monopoliApp = monopoliApp;
    }

    public PannelloDiComando getPannello() {
        return pannello;
    }

    public void setPannello(PannelloDiComando pannello) {
        this.pannello = pannello;
    }

    public Sommario getSommario() {
        return sommario;
    }

    public void setSommario(Sommario sommario) {
        this.sommario = sommario;
    }

    public Tabellone getTabellone() {
        return tabellone;
    }

    public void setTabellone(Tabellone tabellone) {
        this.tabellone = tabellone;
    }

    public void abilitaInizioTurno() {
       this.pannello.setIniziaTurno(true);
       this.gestoreRefresh.refreshPannello(pannello);

    }
    public void iniziaTurno() {

        infoPlayer("TURNO AVVIATO: PROSEGUIRE CON IL LANCIO DEI DADI");
        this.pannello.setIniziaTurno(false);
        this.pannello.setDadi(true);
        this.gestoreRefresh.refreshPannello(pannello);




    }

    public void gestioneTurno() {

        Monopoli.getMonopoliPartita().lancioDadi();
    }

    public void abilitaCasa() {
        if(this.pannello.isHouse() == false) {

            this.pannello.setHouse(true);
            this.gestoreRefresh.refreshPannello(this.pannello);
        }

    }

    public void abilitaHotel() {
        if(this.pannello.isHotel() == false) {
            //infoPlayer("SEI SU UN TUO TERRITORIO, PUOI ACQUISTARE UNA CASA O UN HOTEL");
            this.pannello.setHotel(true);
            this.gestoreRefresh.refreshPannello(this.pannello);
        }
    }

    public void abilitaAcquisto() {
        if(this.pannello.isAcq() == false) {
            this.pannello.setAcq(true);
            this.gestoreRefresh.refreshPannello(this.pannello);
        }
    }


    public void azzeraPulsanti() {
        this.pannello.setHotel(false);
        this.pannello.setHouse(false);
        this.pannello.setDadi(false);
        this.pannello.setIniziaTurno(false);
        this.pannello.setPassaTurno(false);
        this.pannello.setAcq(false);
        this.gestoreRefresh.refreshPannello(pannello);
    }


    public void acquista() {
        Monopoli.getMonopoliPartita().getGameToGUI().acquista();
        this.pannello.setAcq(false);
        this.gestoreRefresh.refreshPannello(this.pannello);
    }

    public void aggiungiCasa(int casella) {
        this.tabellone.aggiungiCasa(casella);
    }

    public void aggiungiHotel(int casella) {
        this.tabellone.aggiungiHotel(casella);
    }

    public void aggiungiPedina(int casella,String nome) {
        this.tabellone.aggiungiPedina(casella,nome);
    }

    public void muoviPedina(String nome,int casella) {
        this.tabellone.muoviPedina(nome,casella);
    }

    public void rimuoviHotel(int casella) {
        this.tabellone.rimuoviHotel(casella);
    }

    public void rimuoviCasa(int casella) {
        this.tabellone.rimuoviCasa(casella);
    }

    public void rimuoviPedina(String nome) {
        this.tabellone.rimuoviPedina(nome);
    }

    public void mostraSelezioneNome() {
        gestoreRefresh.mostraSelezioneNome();
    }
}

